package com.bnz.order.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnz.common.entity.TbPayLog;
import com.bnz.common.utils.IdWorker;
import com.bnz.order.entity.Cart;
import com.bnz.order.entity.TbOrder;
import com.bnz.order.entity.TbOrderItem;
import com.bnz.order.mapper.TbOrderItemMapper;
import com.bnz.order.mapper.TbOrderMapper;
import com.bnz.order.mapper.TbPayLogMapper;
import com.bnz.order.service.OrderService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.xml.crypto.Data;
import java.math.BigDecimal;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class OrderServiceImpl extends ServiceImpl<TbOrderMapper, TbOrder> implements OrderService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private TbOrderItemMapper orderItemMapper;
    @Autowired
    private TbPayLogMapper payLogMapper;

    // 1. 根据登录名得到购物车列表
    @Override
    public List<Cart> findOrderList(String name) {
        if (StringUtils.isNotBlank(name)){
            // 1.1 从redis中得到购物车字符串
            String s = redisTemplate.opsForValue().get(name);
            // 1.2 将购物车字符串转换为对象
            List<Cart> cartList = JSON.parseArray(s, Cart.class);
            return cartList;
        }else {
            return new ArrayList<>();
        }
    }

    // 2. 添加订单
    @Override
    @Transactional // 添加事务
    public void add(TbOrder tbOrder, String name) {
        // 2.1 得到购物车列表
        List<Cart> cartList = findOrderList(name);
        // 定义代表支付总金额的变量
        Double total = 0.0;
        // 2.2 遍历购物车列表，添加订单
        for (Cart cart : cartList) {
            // 2.2.1 构造一个新的订单
            TbOrder order = new TbOrder();
            // 2.2.2 生成订单id
            Long orderId = idWorker.nextId();
            // 2.2.3 为订单属性赋值
            order.setOrderId(orderId);                          // 订单id
            order.setPaymentType(tbOrder.getPaymentType());     // 支付类型，1、在线支付，2、货到付款
            order.setStatus("1");                               // 状态：1、未付款，2、已付款，3、未发货，4、已发货，5、交易成功，6、交易关闭,7、待评价
            order.setCreateTime(new Date());                    // 订单创建时间
            order.setUpdateTime(new Date());                    // 订单修改时间
            order.setSourceType("2");                           // 订单来源
            order.setReceiver(tbOrder.getReceiver());           // 收货人
            order.setReceiverAreaName(tbOrder.getReceiverAreaName());   // 收货人所在地区
            order.setReceiverMobile(tbOrder.getReceiverMobile());       // 收货人手机号码
            order.setSellerId(cart.getSellerId());              // 商家id
            order.setUserId(name);                              // 用户id

            // 2.2.4 定义代表订单总金额的变量
            double sum = 0;
            // 2.2.5 遍历购物车，添加订单项
            for (TbOrderItem orderItem : cart.getOrderItemList()) {
                // 1. 创建一个新的订单项
                TbOrderItem item = new TbOrderItem();
                // 2. 为订单项赋值
                item.setId(idWorker.nextId());
                item.setItemId(orderItem.getItemId());
                item.setOrderId(orderId);
                item.setGoodsId(orderItem.getGoodsId());
                item.setNum(orderItem.getNum());
                item.setPicPath(orderItem.getPicPath());
                item.setPrice(orderItem.getPrice());
                item.setSellerId(orderItem.getSellerId());
                item.setTitle(orderItem.getTitle());
                item.setTotalFee(orderItem.getTotalFee());
                // 3. 累加总金额
                sum += orderItem.getTotalFee().doubleValue();
                // 4. 设置订单实付金额
                order.setPayment(new BigDecimal(sum));
                // 5. 添加订单项
                orderItemMapper.insert(item);
            }
            // 2.2.6 添加订单
            this.save(order);
            // 累加总金额
            total += sum;
        }
        // 2.3 添加支付日志（在数据库和redis中都存有一份）
        TbPayLog payLog = new TbPayLog();
        payLog.setCreateTime(new Date());   // 创建时间
        payLog.setTradeState("0");          // 设置支付状态值，0表示为支付，1表示已支付
        payLog.setOutTradeNo(idWorker.nextId() + "");   // 设置支付订单号
        payLog.setUserId(name);             // 设置用户登录名
        payLog.setPayType(tbOrder.getPaymentType());    // 设置支付类型
        payLog.setTotalFee(new Double(total*100).longValue());  // 设置支付总金额，支付的时候单位是分，所以*100，总金额的类型是lang，所以转换为lang
        // 2.4 将支付日志添加到数据库中
        payLogMapper.insert(payLog);
        // 2.5 将支付日志添加到redis中
        redisTemplate.opsForValue().set(name + "paylog",JSON.toJSONString(payLog));
    }

    // 3. 从redis中取出支付日志
    @Override
    public TbPayLog getPaylogByRedis(String name) {
        // 3.1 从redis中取出支付日志
        return JSON.parseObject(redisTemplate.opsForValue().get(name + "paylog"),TbPayLog.class);
    }
}

